/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "id_generator_impl.h"

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_common
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static id_generator_impl::ITEM_DATA xos_item_data;

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//

	id_generator_impl::id_generator_impl() : start( 2 )
	{
	}

	id_generator_impl::~id_generator_impl()
	{
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 
	// 
	// 

	int id_generator_impl::remove( int mid )
	{
		int nRet = 0;

        ID_LIST input;
        ID_LIST tmp;
		{
			id_impl * p = id_impl::get_item_from_pool();
			p->init();
			p->_pos_xos_stl_set_opt = mid;
			p->_len_xos_stl_set_opt = 1;
			input.push_back( p );
		}
		id_set.subtract_set( tmp, ids, input );
		ids.swap( tmp );
		input.put_back_to_pool();
		tmp.put_back_to_pool();

		return nRet;
	}

	int id_generator_impl::add( int mid )
	{
		int nRet = 0;

        ID_LIST input;
        ID_LIST tmp;
		{
			id_impl * p = id_impl::get_item_from_pool();
			p->init();
			p->_pos_xos_stl_set_opt = mid;
			p->_len_xos_stl_set_opt = 1;
			input.push_back( p );
		}
		id_set.merge_set( tmp, ids, input );
		ids.swap( tmp );
		input.put_back_to_pool();
		tmp.put_back_to_pool();

		return nRet;
	}

	// 
	// 从2开始生成id_impl
	// 
	int id_generator_impl::gen( int * lpnId )
	{
		int ret = 0;

		ID_ITER iter = ids.begin();
		int gen_id = start;
		bool bGet = false;

		if( !bGet && ( iter == ids.end() ) )
		{
			bGet = true;
		}
		
		while( !bGet && ( iter != ids.end() ) )
		{
			id_impl * p = *iter;
			if( gen_id >= p->_pos_xos_stl_set_opt )
			{
				gen_id = p->_pos_xos_stl_set_opt + p->_len_xos_stl_set_opt;
				++iter;
			}
			else
			{
				bGet = true;
			}
		}

		add( gen_id );
		*lpnId = gen_id;
		
		return ret;
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 

    int id_generator_impl::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
		int ret = 0;
		xos_item_data.set_container( mgr::container() );
		item_ptr = &xos_item_data;
		return ret;
    }

	int id_generator_impl::init()
	{
		int nRet = 0;
		return nRet;
	}

	int id_generator_impl::term()
	{
		int nRet = 0;
		ids.put_back_to_pool();
		return nRet;
	}

}
